home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
HAM Radio 3.2
/
Ham Radio Version 3.2 (Chestnut CD-ROMs)(1993).ISO
/
packet
/
n17jsrc
/
bmconv.c
< prev
next >
Wrap
C/C++ Source or Header
|
1991-01-27
|
7KB
|
267 lines
/* This programs convert mail files in the "BM" format to the new mail
file format.
Link object with files.obj, misc.obj and dirutil.obj.
*/
#include <stdio.h>
#include "global.h"
#include "files.h"
static void convert __ARGS((char *dir));
static int isarea __ARGS((char *area));
static void areafile __ARGS((char *filename,char *area));
static void mkdirs __ARGS((char *path));
/* Takes optional subdirectory in /spool/mail to convert as argument.
Defaults to /spool/mail
*/
main(argc,argv)
int argc;
char *argv[];
{
char fname[256];
sprintf(fname,"%s/mail",Newsdir);
mkdirs(fname);
mkdirs(Userdir);
if(argc > 1)
sprintf(fname,"%s/%s",Mailspool,argv[1]);
else
strcpy(fname,Mailspool);
convert(fname);
}
static void
convert(dir)
char *dir;
{
char fname[256],buf[1024],line[20],fpath[256],dirstr[256],*cp;
int msg, skip = 0;
FILE *mfile = NULLFILE, *fp;
printf("Scanning directory %s\n",dir);
sprintf(dirstr,"%s/*",dir);
filedir(dirstr,0,line);
while(line[0] != '\0') {
if(skip) {
if(stricmp(line,buf) == 0)
skip = 0;
filedir(dirstr,1,line);
continue;
}
if(strchr(line,'.') == NULLCHAR) { /* possible directory */
/* doesn't work if filedir() doesn't operate on directories */
sprintf(fname,"%s/%s",dir,line);
strcpy(buf,line);
skip = 1;
convert(fname);
filedir(dirstr,0,line);
continue;
}
if(strlen(line) > 3 && stricmp(&line[strlen(line)-4],".txt") == 0) {
sprintf(buf,"%s/%s",dir,line);
if((fp = fopen(buf,READ_TEXT)) == NULLFILE) {
filedir(dirstr,1,line);
continue;
}
printf("Processing %s\n",buf);
line[strlen(line)-4] = '\0';
if(isarea(line) || stricmp(dir,Mailspool) != 0) {
if(strlen(dir) > strlen(Mailspool)) {
sprintf(buf,"%s.%s",&dir[strlen(Mailspool)+1],line);
while((cp = strchr(buf,'/')) != NULLCHAR)
*cp = '.';
}
else
sprintf(buf,"%s",line);
}
else
sprintf(buf,"mail.%s",line);
areafile(fpath,buf);
mkdirs(fpath);
msg = 0;
mfile = NULLFILE;
while(fgets(buf,sizeof(buf),fp) != NULLCHAR) {
if(strnicmp("From ",buf,5) == 0) {
fclose(mfile);
sprintf(fname,"%s/%u",fpath,++msg);
if((mfile = fopen(fname,WRITE_TEXT)) == NULLFILE){
printf("Can't write %s\n",fname);
exit(1);
}
if((cp = strchr(buf+5,' ')) != NULLCHAR)
*cp = '\0';
fprintf(mfile,"Return-Path: %s\n",buf+5);
}
else
fputs(buf,mfile);
}
fclose(mfile);
fclose(fp);
sprintf(buf,"%s/active",Newsdir);
if((fp = fopen(buf,APPEND_TEXT)) == NULLFILE) {
printf("Can't write %s\n",buf);
exit(1);
}
if(isarea(line) || stricmp(dir,Mailspool) != 0) {
if(strlen(dir) > strlen(Mailspool)) {
sprintf(buf,"%s.%s",&dir[strlen(Mailspool)+1],line);
while((cp = strchr(buf,'/')) != NULLCHAR)
*cp = '.';
}
else
strcpy(buf,line);
fprintf(fp,"%s ",buf);
}
else
fprintf(fp,"mail.%s ",line);
if(msg)
fprintf(fp,"%u 1 y",msg);
fprintf(fp,"\n");
fclose(fp);
}
filedir(dirstr,1,line);
}
}
/* Returns 1 if name is a public message Area, 0 otherwise */
static int
isarea(name)
char *name;
{
char buf[1024], *cp;
FILE *fp;
if((fp = fopen(Arealist,READ_TEXT)) == NULLFILE)
return 0;
while(fgets(buf,sizeof(buf),fp) != NULLCHAR) {
/* The first word on each line is all that matters */
if((cp = strchr(buf,' ')) == NULLCHAR)
if((cp = strchr(buf,'\t')) == NULLCHAR)
continue;
*cp = '\0';
if((cp = strchr(buf,'\t')) != NULLCHAR)
*cp = '\0';
if(stricmp(name,buf) == 0) { /* found it */
fclose(fp);
return 1;
}
}
fclose(fp);
return 0;
}
static void
areafile(filename,area)
char *filename;
char *area;
{
FILE *fp;
char buf[1024], *cp;
static char *delim = " \t\n";
if((fp = fopen(Pointerfile,READ_TEXT)) != NULLFILE){
while(fgets(buf,sizeof(buf),fp) != NULLCHAR){
if((cp = strtok(buf,delim)) == NULLCHAR)
continue;
if(stricmp(cp,area) == 0 &&
(cp = strtok(NULLCHAR,delim)) != NULLCHAR){
strcpy(filename,cp);
fclose(fp);
return;
}
}
fclose(fp);
}
strcpy(buf,area);
while((cp = strchr(buf,'.')) != NULLCHAR)
*cp = '/';
sprintf(filename,"%s/%s",Newsdir,buf);
}
static void
mkdirs(path)
char *path;
{
char *cp, buf[128];
strcpy(buf,path);
if(path[strlen(path)-1] != '/')
strcat(buf,"/");
cp = buf;
while((cp = strchr(cp,'/')) != NULLCHAR) {
*cp = '\0';
#ifdef UNIX
mkdir(buf,0755);
#else
mkdir(buf);
#endif
*cp++ = '/';
}
}
#ifdef UNIX
#include <sys/types.h>
#include <dirent.h>
/* wildcard filename lookup */
filedir(name, times, ret_str)
char *name;
int times;
char *ret_str;
{
static char dname[128], fname[128];
static DIR *dirp = NULL;
struct dirent *dp;
char *cp, temp[128];
/*
* Make sure that the NULL is there in case we don't find anything
*/
ret_str[0] = '\0';
if (times == 0) {
/* default a null name to *.* */
if (name == NULL || *name == '\0')
name = "*.*";
/* split path into directory and filename */
if ((cp = strrchr(name, '/')) == NULL) {
strcpy(dname, ".");
strcpy(fname, name);
} else {
strcpy(dname, name);
dname[cp - name] = '\0';
strcpy(fname, cp + 1);
/* root directory */
if (dname[0] == '\0')
strcpy(dname, "/");
/* trailing '/' */
if (fname[0] == '\0')
strcpy(fname, "*.*");
}
/* close directory left over from another call */
if (dirp != NULL)
closedir(dirp);
/* open directory */
if ((dirp = opendir(dname)) == NULL) {
printf("Could not open DIR (%s)\n", dname);
return;
}
} else {
/* for people who don't check return values */
if (dirp == NULL)
return;
}
/* scan directory */
while ((dp = readdir(dirp)) != NULL) {
/* test for name match */
/* if (wildmat(dp->d_name, fname)) {*/
if (!strcmp(dp->d_name, fname) || (fname[0] == '*' &&
!strcmp(&dp->d_name[strlen(dp->d_name) - strlen(fname)+1],
&fname[1]))) { /* ...when we do not use wildmat */
/* test for regular file */
sprintf(temp, "%s/%s", dname, dp->d_name);
strcpy(ret_str, dp->d_name);
break;
}
}
/* close directory if we hit the end */
if (dp == NULL) {
closedir(dirp);
dirp = NULL;
}
}
#endif